package com.av.db.layer.impl;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.av.db.dataobjects.Abono;
import com.av.db.layer.interfaces.AbonoLayer;
import com.av.exceptions.AvException;

/**
 * Clase que contiene la implementacion de funciones para la tabla de abonos
 * utilizando la tecnologia de Hibernate
 * 
 * @author Victor J Morales R
 * 
 */
public class AbonoLayerImpl extends HibernateDaoSupport implements AbonoLayer {

	private static Logger log = Logger.getLogger(AbonoLayerImpl.class);

	/**
	 * Funcion que actualiza en la base de datos un abono en especifo
	 */
	@Override
	public void actualizar(Abono abono) throws AvException {
		log.info("Inicio - actualizar(Abono abono)");
		log.debug("Id : " + abono.getId());
		log.debug("Abono : " + abono.toString());

		if (abono == null) {
			log.error("No se puede actualizar un abono nulo");
			throw new AvException("Abono nulo a ser actualizado");
		}

		if (abono.getId() < 0) {
			log.error("No se puede actualizar un abono con identificador "
					+ "invalido");
			throw new AvException("Abono con identificador invalido a ser "
					+ "actualizado");
		}

		getHibernateTemplate().update(abono);

		log.info("Fin - actualizar(Abono abono)");
	}// actualizar

	/**
	 * Funcion que agrega en la base de datos configura un nuevo abono
	 */
	@Override
	public void agregar(Abono abono) throws AvException {
		log.info("Inicio - agregar(Abono abono)");
		log.debug("Abono : " + abono.toString());

		if (abono == null) {
			log.error("No se puede agregar un abono nulo");
			throw new AvException("Abono nulo a ser agregado");
		}

		getHibernateTemplate().save(abono);

		log.info("Fin - agregar(Abono abono)");
	}// agregar

	/**
	 * Funcion que elimina un abono especifico de la base de datos configurada
	 */
	@Override
	public void eliminar(Abono abono) throws AvException {
		log.info("Inicio - eliminar(Abono abono)");
		log.debug("Abono : " + abono.toString());

		if (abono == null) {
			log.error("No se puede eliminar un abono nulo");
			throw new AvException("Abono nulo a ser eliminado");
		}

		if (abono.getId() < 0) {
			log
					.error("No se puede eliminar un abono con identificador negativo");
			throw new AvException("Identificador negativo");
		}

		getHibernateTemplate().delete(abono);

		log.info("Fin - eliminar(Abono abono)");
	}// eliminar

	/**
	 * Funcion que obtiene un abono de la base de datos configurada a partir de
	 * su identificador
	 */
	@Override
	public Abono obtener(int id) {
		log.info("Inicio - obtener(int id)");
		log.debug("Id : " + id);

		if (id < 0) {
			log.warn("No se puede obtener un abono con identificador negativo");
			return null;
		}

		Abono tmp = getHibernateTemplate().get(Abono.class, id);

		if (tmp != null) {
			log.debug("Abono : " + tmp.toString());
		} else {
			log.debug("Abono no encontrado");
		}

		log.info("Fin - obtener(int id)");

		return tmp;
	}// obtener

	/**
	 * Funcion que obtiene el conjunto de todos los abonos registrados en la
	 * base de datos configurada
	 */
	@Override
	public Abono[] obtener() {
		log.info("Inicio - obtener()");

		List<?> l = getSession().createCriteria(Abono.class)
				.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).addOrder(
						Order.asc(Abono.ID)).list();

		Abono[] tmp = null;
		if (l != null && l.size() > 0) {
			log.debug("Cantidad obtenida : " + l.size());
			tmp = new Abono[l.size()];
			l.toArray(tmp);
		}

		log.info("Fin - obtener()");

		return tmp;
	}// obtener}
}// AbonoLayerImpl